/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager.editar;

import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.entidade.selo.Distribuicao;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.DistribuicaoServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.TipoSeloServico;
import br.com.deployment.servico.UsuarioServico;
import br.com.deployment.utilitario.DistribuirSelos;
import br.com.deployment.utilitario.ResulDistribuicao;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author ronieresousa
 */
@ManagedBean
@SessionScoped
public class ManagerEditarDistribuicao {

    @EJB
    private DistribuicaoServico distribuicaoServico;
    
    @EJB
    private TipoSeloServico tipoSeloServico;
    
    @EJB
    private SeloServico  seloServico;
    
    @EJB
    private UsuarioServico usuarioServico;
        
    private Usuario usuario;
    
    private List<ResulDistribuicao> lsRd;
    private Distribuicao distribuicao;
    private List<DistribuirSelos> listDistribuirSelo;
    private List<DistribuirSelos> listRemoverSelo;
    private DistribuirSelos distribuirSelos;
    private List<Selo> lstSelosAll;
    private List<Selo> lstSelosAllEdit;

    public ManagerEditarDistribuicao() {
        
    }

    @PostConstruct
    public void init() {
        distribuirSelos = new DistribuirSelos();       
        lsRd = new ArrayList<ResulDistribuicao>();
        lstSelosAll = new ArrayList<Selo>();
        lstSelosAllEdit = new ArrayList<Selo>();
        listRemoverSelo = new ArrayList<DistribuirSelos>();
        listDistribuirSelo = new ArrayList<DistribuirSelos>();
        usuario = new Usuario();
        atribuiUsuarioNome();
    }
    
    public void reinit() {
        distribuirSelos = new DistribuirSelos();       
        lsRd = new ArrayList<ResulDistribuicao>();
        lstSelosAll = new ArrayList<Selo>();
        lstSelosAllEdit = new ArrayList<Selo>();
        listRemoverSelo = new ArrayList<DistribuirSelos>();
        listDistribuirSelo = new ArrayList<DistribuirSelos>();
    }

    public void redirect(String string, Distribuicao dis) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            reinit();
            this.distribuicao = dis;
            listDistribuirSelo = distribuicaoServico.getDistribuirSelos(this.distribuicao);
            

            context.getExternalContext().redirect(string);
        } catch (IOException ex) {
            Logger.getLogger(ManagerEditarDistribuicao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void atribuiUsuarioNome() {
        try {
            usuario = usuarioServico.verificarUsuarioNome(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
        } catch (Exception e) {
            Msg.messagemWarn("Para atribuir Selos efetue o Login");

        }
    }
    
    
    // Verifica a Quantidade de Selos e se for igual ela atribui
    public boolean verificaQtd(int qtd) {
        for (DistribuirSelos dsaux : listDistribuirSelo) {

            if (distribuirSelos.getTipoSelo().getId() == dsaux.getTipoSelo().getId()) {
                qtd += dsaux.getQuantidade();
            }
        }
        return distribuicaoServico.containsSelo(distribuirSelos.getTipoSelo(), qtd);
    }
    
    
    public void addList() {
        
        for (DistribuirSelos ds : listDistribuirSelo) {
            if (distribuirSelos.getTipoSelo().getId() == ds.getTipoSelo().getId()) {
                ds.setQuantidade(distribuirSelos.getQuantidade() + ds.getQuantidade());
                listDistribuirSelo.set(listDistribuirSelo.indexOf(ds), ds);
                if(!verificaQtd(ds.getQuantidade())){
                    Msg.messagemWarn("Selos Insuficientes");
                    return;
                }
            }
        }     
        
        distribuirSelos.setTipoSelo(tipoSeloServico.find(distribuirSelos.getTipoSelo().getId()));
        
        if(distribuirSelos.getLstSelo() != null){
            if(distribuirSelos.getQuantidade() > distribuirSelos.getLstSelo().size()){
                int qtd = distribuirSelos.getQuantidade() - distribuirSelos.getLstSelo().size();            
                if(!verificaQtd(qtd)){                
                    Msg.messagemWarn("Selos Insuficientes");
                    return;
                }            
            }
            listDistribuirSelo.add(distribuirSelos);
            distribuirSelos = new DistribuirSelos();
        }
        
        if(verificaQtd(distribuirSelos.getQuantidade())){
            listDistribuirSelo.add(distribuirSelos);
            distribuirSelos = new DistribuirSelos();
        }else{
            Msg.messagemWarn("Selos Insuficientes");
        }
      
    }

    
    
    public void limpaDistribuir() {
        distribuirSelos.setQuantidade(0);
        distribuirSelos = new DistribuirSelos();
    }

    public void remove(DistribuirSelos ds) {
        listRemoverSelo.add(ds);
        listDistribuirSelo.remove(ds);
    }

    public void editar(DistribuirSelos ds) {
        List<Selo> lstSelo = new ArrayList<Selo>();
        distribuirSelos = ds;        
        listDistribuirSelo.remove(ds);
    
    }
    public void distribuir() {
        lstSelosAll = distribuicaoServico.selosDistribuicao(distribuicao);
        
        
        for (DistribuirSelos ds : listRemoverSelo) {    
            
            for (Selo selo : ds.getLstSelo()) {
                selo.setDistribuido(false);
                lstSelosAllEdit.add(selo);
                lstSelosAll.remove(selo);
            }
        }
        
        
        for (DistribuirSelos ds : listDistribuirSelo) {
            
             List<Selo> setList = new ArrayList<Selo>();
        
            distribuirSelos = ds;
            
            if(distribuirSelos.getLstSelo() != null){
                
                int quantSelo = distribuirSelos.getLstSelo().size();

                

                if(distribuirSelos.getQuantidade() > distribuirSelos.getLstSelo().size()){
                    
                    int qtd = distribuirSelos.getQuantidade() - distribuirSelos.getLstSelo().size();  

                    distribuirSelos.getLstSelo().addAll(distribuicaoServico.atribuirSelos(distribuirSelos.getTipoSelo(), qtd));


                    for (int i = quantSelo ; i < distribuirSelos.getLstSelo().size() ; i++) {
                            Selo selo = distribuirSelos.getLstSelo().get(i);                    
                            selo.setDistribuido(true);
                            lstSelosAllEdit.add(selo);
                            setList.add(selo);
                            
                    }
                    
                    lstSelosAll.addAll(setList);
                    
                }

                if(distribuirSelos.getQuantidade() < distribuirSelos.getLstSelo().size()){

                    int qtd = distribuirSelos.getQuantidade();

                    int qtdrem = quantSelo - qtd;

                    List<Selo> list = distribuirSelos.getLstSelo();
                    List<Selo> listAux = new ArrayList<Selo>();


                    for (int i = qtd; i < quantSelo; i++) {
                        listAux.add(list.get(i));
                    }
                               
                    for (Selo selo : listAux) {
                        selo.setDistribuido(false);
                        lstSelosAllEdit.add(selo);
                        distribuirSelos.getLstSelo().remove(selo);
                        lstSelosAll.remove(selo);
                   }
                }
                montarListResul(ds);
            }else{
                List<Selo> ls = distribuicaoServico.atribuirSelos(distribuirSelos.getTipoSelo(), distribuirSelos.getQuantidade());
                for (Selo selo : ls) {
                    selo.setDistribuido(true);
                    lstSelosAllEdit.add(selo);
                    lstSelosAll.add(selo);
                }
                ds.setLstSelo(ls);
                montarListResul(ds);
            }
            
            
        }   
        
        org.primefaces.context.RequestContext.getCurrentInstance().execute("dialogEdit.show();");
        
       
    }
    
    public void montarListResul(DistribuirSelos ds){        
        ResulDistribuicao rd = new ResulDistribuicao();
        rd.setSelo(ds.getLstSelo());
        rd.setTipoSelo(ds.getTipoSelo());
        lsRd.add(rd);
        
    }
    
    public void editarDistribuicao() {
        seloServico.editSelos(lstSelosAllEdit);
        
        distribuicao.setExecutante(usuario);
        distribuicao.setListSelo(lstSelosAll);
        distribuicaoServico.edit(distribuicao);
        
        reinit();
        Msg.messagemInfo("Distribuição realizada com Sucesso");
    }
    
    
    
    public void limpaList() {
        listDistribuirSelo = new ArrayList<DistribuirSelos>();
    }
    
    public void handleSelectTipoSelo(SelectEvent event) {
        TipoSelo tipoSelo = (TipoSelo) event.getObject();
        distribuirSelos.setTipoSelo(tipoSelo);

    }

    public Distribuicao getDistribuicao() {
        return distribuicao;
    }

    public void setDistribuicao(Distribuicao distribuicao) {
        this.distribuicao = distribuicao;
    }

    public List<ResulDistribuicao> getLsRd() {
        return lsRd;
    }

    public void setLsRd(List<ResulDistribuicao> lsRd) {
        this.lsRd = lsRd;
    }

   

    public List<Selo> getLstSelosAll() {
        return lstSelosAll;
    }

    public void setLstSelosAll(List<Selo> lstSelosAll) {
        this.lstSelosAll = lstSelosAll;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    
    
    public List<DistribuirSelos> getListDistribuirSelo() {
        return listDistribuirSelo;
    }

    public void setListDistribuirSelo(List<DistribuirSelos> listDistribuirSelo) {
        this.listDistribuirSelo = listDistribuirSelo;
    }

    public DistribuirSelos getDistribuirSelos() {
        return distribuirSelos;
    }

    public void setDistribuirSelos(DistribuirSelos distribuirSelos) {
        this.distribuirSelos = distribuirSelos;
    }

    public List<ResulDistribuicao> getLsRD() {
        return lsRd;
    }

    public void setLsRD(List<ResulDistribuicao> lsRD) {
        this.lsRd = lsRD;
    }
}

//int qtd = 0;
//            for(Selo s :lstSelo){
//                   tipoSelo = s.getTipoSelo();
//                   //qtd = distribuicaoServico.count(tipoSelo);                           
//                   distribuirSelos.setTipoSelo(tipoSelo);
////                   listDistribuirSelo.add(distribuirSelos);
//                   System.out.println(distribuirSelos);
//            }
////            listDistribuirSelo.add(distribuirSelos);
//            System.out.println(qtd); 
//            // lstSeloAll = distribuicaoServico.verificarTipoSelo(tipoSelo);
////             System.out.println(tipoSelo);
////             System.out.println(qtd);
////            //distribuicaoServico.verificarTipoSelo();